以下三張圖分別代表 小劍、彎刀、大魔劍 三種武器
(圖片源自unsplash)
我們把這些圖示放入遊戲專案中
小劍
彎刀
大魔劍 (圖片找得太尖細了...
在Angular專案架構中,會把這些照片等資源都放入\src\assets
底下
在這裡新建一個 image
資料夾
這邊的
.gitkeep
可以用力刪除
因為git不會控管空資料夾,所以創一個檔案.gitkeep
給git看
這資料夾底下有東西所以請控管他,用途僅此
然後把三張圖片放入到此資料夾中
透過原生的HTML引用圖片的方法
把 <img src="...">
放入For迴圈中,讓圖片循環的產生
同時為了避免超出邊界框,限制圖片高度 height="150"
修改 store.component.html
<h2>商店區塊</h2>
<div *ngFor="let weapon of weapons; let i = index">
<div>武器編號: {{i + 1}}</div>
<div>武器名稱: {{weapon.name}}</div>
<div *ngIf="weapon.atk">武器攻擊力: {{weapon['atk']}}</div>
<img src="assets/image/小劍.jpg" height="150" alt="武器">
<br><br>
</div>
但是這樣每張照片都一樣,照片每一把都是小劍,沒辦法達成預期
所以接下來要做的就是讓程式去控制要顯示的圖片
在程式內先寫好每把武器對應的圖片路徑
新建一個陣列 imgSources
,依序存放圖片路徑 ['assets/image/小劍.jpg', 'assets/image/彎刀.jpg', 'assets/image/大魔劍.jpg']
修改 store.component.ts
...
export class StoreComponent implements OnInit {
weapons = [
{name: '小劍', atk: '5'},
{name: '彎刀', atk: '7'},
{name: '大魔劍', atk: '11'}
];
imgSources = ['assets/image/小劍.jpg', 'assets/image/彎刀.jpg', 'assets/image/大魔劍.jpg']
constructor() { }
ngOnInit(): void {
}
}
接著使用 屬性繫結 [src]
將程式陣列變數 與 圖片位置src
做綁定
透過index來索引圖片陣列,顯示出第 i
個路徑的圖片位置
修改 store.component.html
<h2>商店區塊</h2>
<div *ngFor="let weapon of weapons; let i = index">
<div>武器編號: {{i + 1}}</div>
<div>武器名稱: {{weapon.name}}</div>
<div *ngIf="weapon.atk">武器攻擊力: {{weapon['atk']}}</div>
<img [src]="imgSources[i]" height="150" alt="武器">
<br><br>
</div>
被中括號[]
包起來的attribute,就稱 property
這樣就大功告成啦~
完成畫面
刪除 imgSources
陣列
改將圖片路徑寫在Weapon物件內,新增 imgSrc
屬性
這樣子的寫法也能達成相同效果
修改 store.component.ts
export class StoreComponent implements OnInit {
weapons = [
{name: '小劍', atk: '5', imgSrc: 'assets/image/小劍.jpg'},
{name: '彎刀', atk: '7', imgSrc: 'assets/image/彎刀.jpg'},
{name: '大魔劍', atk: '11', imgSrc: 'assets/image/大魔劍.jpg'}
];
constructor() { }
ngOnInit(): void {
}
}
接著修改 store.component.html
,用 weapon.imgSrc
取得物件內的圖片路徑
<h2>商店區塊</h2>
<div *ngFor="let weapon of weapons; let i = index">
<div>武器編號: {{i + 1}}</div>
<div>武器名稱: {{weapon.name}}</div>
<div *ngIf="weapon.atk">武器攻擊力: {{weapon['atk']}}</div>
<img [src]="weapon.imgSrc" height="150" alt="武器">
<br><br>
</div>
若圖片檔名改以數字流水號來命名
要取用時只需使用index i
的遞增特性
想辦法組合字串與變數,兜出檔案路徑名稱即可
將 [src]
修改為 [src]="'assets/image/' + (i+1) +'.jpg'"
修改 store.component.html
<h2>商店區塊</h2>
<div *ngFor="let weapon of weapons; let i = index">
<div>武器編號: {{i + 1}}</div>
<div>武器名稱: {{weapon.name}}</div>
<div *ngIf="weapon.atk">武器攻擊力: {{weapon['atk']}}</div>
<img [src]="'assets/image/' + (i+1) +'.jpg'" height="150" alt="武器">
<div>圖片路徑: {{'assets/image/' + (i+1) +'.jpg'}}</div>
<br><br>
</div>
若對這一串還不是很了解的話
可以將兜出來的字串(圖片路徑),透過繫結綁定印出來看看
Attribute
與 Property
的中文都是屬性,這兩者有何差別?
HTML上的 attribute
會被轉為對應的DOM
DOM上的各項數值的欄位稱為property
attribute
指的是 在HTML上就有的屬性<img src="assets/image/小劍.jpg" height="150" alt="武器">
例如src
、height
、alt
這些都是 attribute
property
指的是 DOM上的元素<img [src]="'assets/image/小劍.jpg'" [height]="'150'" [alt]="'武器'">
例如 [src]
、[height]
、[alt]
這些都是 property
Angular讓我們能對著既有的HTML Attribute
在外層加上殼[]
變成Property,就可以對值
進行操作
另外,Angular也可以在自定義的標籤上,帶入自定義的Property屬性值
這部分用法未來會再提及
到這一步 恭喜你,已經學會69%的 Angular
以下部分不是非常重要,有興趣再看就好
property
時會連動影響 attribute
譬如在HTML樣板中這樣子玩 (開發時這樣玩會被打死)
同時有 src
又有 [src]
、同時有 height
又有 [height]
並且兩邊都設定成不同數值
<img src="assets/image/1.jpg" [src]="'assets/image/3.jpg'"
height="9999999" [height]="'150'">
結果可以看到 attribute
的值與 property
的值相同
等於attribute
被屬性繫節的值覆蓋了
來看一個例子
在HTML上只留下 <input>
以及 預設值 value
勇者一號
<input type="text" value="勇者一號">
輸入框在被修改之前,Attribute
與 Property
都是 勇者一號
接著手動輸入文字,將勇者一號改為砲灰一號
修改輸入框之後在開發工具中重新點擊一次該DOM
此時 Property
為砲灰一號,但Attribute
仍是勇者一號
使用屬性繫節也會得到相同結果
<input type="text" value="勇者一號" [value]="'勇者一號'">
這裡只能透過Javascript的 setAttribute()
手段來修改HTML Attribute